<?php
class ModelCatalogProduct extends Model {
	public function updateViewed($product_id) {
		$this->db->query("UPDATE " . DB_PREFIX . "product SET viewed = (viewed + 1) WHERE product_id = '" . (int) $product_id . "'");
	}
	public function getProduct($product_id) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		
		$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int) $customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int) $customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int) $customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int) $this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int) $this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int) $this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int) $product_id . "' AND pd.language_id = '" . (int) $this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "'");
		if ($query->num_rows) {
			if ($query->row['special']) {
				$special = $this->currency->format($this->tax->calculate($query->row['special'], $query->row['tax_class_id'], $this->config->get('config_tax')));
			}
			else {
				$special = false;
			}
			$query->row['old_name'] = $query->row['name'];
			$query->row['name'] = $this->cut_str(htmlspecialchars_decode($query->row['name']), 40);
			$query->row['price_old'] = $query->row['price'];
			$query->row['rating'] = (int) $query->row['rating'];
			$query->row['discount_per'] = $special ? (100 - (round(((int) (substr($special, 1, -1)) / $query->row['price_old']), 2) * 100)) : 0;
			if ($query->row['discount_per'] == 100) {
				$query->row['discount_per'] = (100 - (round(((int) $query->row['special'] / $query->row['price_old']), 2) * 100));
			}
			$query->row['price'] = '$' . round($query->row['price'], 2);
			return $query->row;
		}
		else {
			return false;
		}
	}
	public function getProducts($data = array()) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		
		$cache = md5(http_build_query($data));
		
		// $product_data = $this->cache->get ( 'product.' . ( int
		// )$this->config->get ( 'config_language_id' ) . '.' . ( int
		// )$this->config->get ( 'config_store_id' ) . '.' . ( int
		// )$customer_group_id . '.' . $cache );
		$product_data = array();
		if (!$product_data) {
			$sql = "SELECT p.product_id, COUNT(*) AS total_num, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)";
			
			if (!empty($data['filter_tag'])) {
				$sql .= " LEFT JOIN " . DB_PREFIX . "product_tag pt ON (p.product_id = pt.product_id)";
			}
			
			if (!empty($data['filter_category_id'])) {
				$sql .= " LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id)";
			}
			
			// 加入销售量排序
			if (isset($data['sort']) && $data['sort'] == 'total_num') {
				$sql .= "JOIN " . DB_PREFIX . "order_product op ON p.product_id =op.product_id
					   JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id)";
			}
			
			if (isset($data['filter'])) {
				$sql .= " JOIN " . DB_PREFIX . "product_attribute pa ON (p.product_id=pa.product_id) ";
			}
			
			$sql .= " WHERE pd.language_id = '" . (int) $this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "'";
			
			// 是否是推荐商品
			if (!empty($data['is_rec'])) {
				$sql .= " AND p.is_rec=1 ";
			}
			
			// 是否是特价商品
			if (!empty($data['is_sale'])) {
				$sql .= " AND p.is_sale=1";
			}
			if (!empty($data['filter'])) {
				$filters = array();
				foreach ($data['filter'] as $fid => $text) {
					$filters[] = " (pa.attribute_id={$fid} AND pa.text='{$text}') ";
				}
				$sql .= " AND (" . implode(" OR ", $filters) . ") AND pa.language_id=" . (int) $this->config->get('config_language_id');
				$con_num = count($filters);
			}
			
			if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {
				$sql .= " AND (";
				
				if (!empty($data['filter_name'])) {
					$implode = array();
					
					$words = explode(' ', trim(preg_replace('/\s\s+/', ' ', $data['filter_name'])));
					
					foreach ($words as $word) {
						if (!empty($data['filter_description'])) {
							$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' AND LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
						}
						else {
							$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
						}
					}
					
					if ($implode) {
						$sql .= " " . implode(" AND ", $implode) . "";
					}
				}
				
				if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {
					$sql .= " OR ";
				}
				
				if (!empty($data['filter_tag'])) {
					$implode = array();
					
					$words = explode(' ', trim(preg_replace('/\s\s+/', ' ', $data['filter_tag'])));
					
					foreach ($words as $word) {
						$implode[] = "LCASE(pt.tag) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
					}
					
					if ($implode) {
						$sql .= " " . implode(" AND ", $implode) . " AND pt.language_id = '" . (int) $this->config->get('config_language_id') . "'";
					}
				}
				
				$sql .= ")";
			}
			
			if (!empty($data['filter_category_id'])) {
				if (!empty($data['filter_sub_category'])) {
					$implode_data = array();
					
					$implode_data[] = "p2c.category_id = '" . (int) $data['filter_category_id'] . "'";
					
					$this->load->model('catalog/category');
					
					$categories = $this->model_catalog_category->getCategoriesByParentId($data['filter_category_id']);
					
					foreach ($categories as $category_id) {
						$implode_data[] = "p2c.category_id = '" . (int) $category_id . "'";
					}
					
					$sql .= " AND (" . implode(' AND ', $implode_data) . ")";
				}
				else {
					$sql .= " AND p2c.category_id = '" . (int) $data['filter_category_id'] . "'";
				}
			}
			
			if (!empty($data['filter_manufacturer_id'])) {
				$sql .= " AND p.manufacturer_id = '" . (int) $data['filter_manufacturer_id'] . "'";
			}
			
			$sql .= " GROUP BY p.product_id";
			
			if (isset($con_num)) {
				$sql .= " HAVING (count(pa.attribute_id)={$con_num}) ";
			}
			
			$sort_data = array( 
				'pd.name', 
				'p.model', 
				'p.quantity', 
				'p.price', 
				'rating', 
				'p.sort_order', 
				'p.date_added', 
				'total_num' 
			);
			
			if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
				if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
					$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
				}
				else {
					$sql .= " ORDER BY " . $data['sort'];
				}
			}
			else {
				$sql .= " ORDER BY p.sort_order";
			}
			
			if (isset($data['order']) && ($data['order'] == 'DESC')) {
				$sql .= " DESC, LCASE(pd.name) DESC";
			}
			else {
				$sql .= " ASC, LCASE(pd.name) ASC";
			}
			
			if (isset($data['start']) || isset($data['limit'])) {
				if ($data['start'] < 0) {
					$data['start'] = 0;
				}
				
				if ($data['limit'] < 1) {
					$data['limit'] = 20;
				}
				
				$sql .= " LIMIT " . (int) $data['start'] . "," . (int) $data['limit'];
			}
			// 			echo $sql;die();
			$product_data = array();
			$query = $this->db->query($sql);
			
			foreach ($query->rows as $result) {
				$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
			}
			
			$this->cache->set('product.' . (int) $this->config->get('config_language_id') . '.' . (int) $this->config->get('config_store_id') . '.' . (int) $customer_group_id . '.' . $cache, $product_data);
		}
		return $product_data;
	}
	public function getProductSpecials($data = array()) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		
		$sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int) $customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id";
		
		$sort_data = array( 
			'pd.name', 
			'p.model', 
			'ps.price', 
			'rating', 
			'p.sort_order' 
		);
		
		if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
			if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
				$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
			}
			else {
				$sql .= " ORDER BY " . $data['sort'];
			}
		}
		else {
			$sql .= " ORDER BY p.sort_order";
		}
		
		if (isset($data['order']) && ($data['order'] == 'DESC')) {
			$sql .= " DESC, LCASE(pd.name) DESC";
		}
		else {
			$sql .= " ASC, LCASE(pd.name) ASC";
		}
		
		if (isset($data['start']) || isset($data['limit'])) {
			if ($data['start'] < 0) {
				$data['start'] = 0;
			}
			
			if ($data['limit'] < 1) {
				$data['limit'] = 20;
			}
			
			$sql .= " LIMIT " . (int) $data['start'] . "," . (int) $data['limit'];
		}
		
		$product_data = array();
		
		$query = $this->db->query($sql);
		
		foreach ($query->rows as $result) {
			$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
		}
		
		return $product_data;
	}
	
	/**
	 * 获取最新商品
	 *
	 * @param unknown_type $limit        	
	 */
	public function getLatestProducts($limit) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		
		// $product_data = $this->cache->get ( 'product.latest.' . ( int )
		// $this->config->get ( 'config_language_id' ) . '.' . ( int )
		// $this->config->get ( 'config_store_id' ) . '.' . $customer_group_id .
		// '.' . ( int ) $limit );
		

		if (!$product_data) {
			$query = $this->db->query("SELECT p.product_id FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "' ORDER BY p.date_added DESC LIMIT " . (int) $limit);
			
			foreach ($query->rows as $result) {
				$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
			}
			
			$this->cache->set('product.latest.' . (int) $this->config->get('config_language_id') . '.' . (int) $this->config->get('config_store_id') . '.' . $customer_group_id . '.' . (int) $limit, $product_data);
		}
		
		return $product_data;
	}
	
	/**
	 * 获取推荐商品
	 *
	 * @param unknown_type $limit        	
	 */
	public function getRecProcucts($limit) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		
		// $product_data = $this->cache->get ( 'product.recProduct.' . ( int )
		// $this->config->get ( 'config_language_id' ) . '.' . ( int )
		// $this->config->get ( 'config_store_id' ) . '.' . $customer_group_id .
		// '.' . ( int ) $limit );
		

		/*
		 * echo
		 * "<br>***********************************************推荐商品***<br>";
		 * var_dump($product_data);
		 */
		
		// **********加入后台设置条件**************
		// if (empty ( $product_data )) {
		$query = $this->db->query("SELECT product_id FROM `" . DB_PREFIX . "product` WHERE is_rec=1 ORDER BY product_id DESC LIMIT {$limit}");
		foreach ($query->rows as $result) {
			$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
		}
		$this->cache->set('product.recProduct.' . (int) $this->config->get('config_language_id') . '.' . (int) $this->config->get('config_store_id') . '.' . $customer_group_id . '.' . (int) $limit, $product_data);
		// }
		return $product_data;
	}
	public function getOnSaleTotalProducts($data = array()) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		$query = $this->db->query("SELECT count(*) as total FROM `" . DB_PREFIX . "product_special` GROUP BY product_id ");
		return $query->row['total'];
	}
	
	/**
	 * 获取特价商品
	 *
	 * @param unknown_type $limit        	
	 */
	public function getOnSaleProducts($data) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		if (is_array($data)) {
			$limit = $data['limit'];
			$start = $data['start'];
			$order = $data['order'];
			$sort = $data['sort'];
		}
		else {
			$limit = $data;
			$start = 0;
			$sort = 'product_special_id';
			$order = 'DESC';
		}
		
		$sql = "SELECT ps.product_id FROM `" . DB_PREFIX . "product_special` ps ";
		if ('pd.name' == $sort) {
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_description pd ON (ps.product_id = pd.product_id)";
		}
		elseif ($sort != 'product_special_id') {
			$sql .= ' LEFT JOIN ' . DB_PREFIX . "product p ON ps.product_id=p.product_id ";
		}
		$sql .= "WHERE (ps.date_start<=now() OR ps.date_start='0000-00-00') AND (ps.date_end>=NOW() OR ps.date_end='0000-00-00')";
		$query = $this->db->query("{$sql} GROUP BY ps.product_id ORDER BY {$sort} {$order} LIMIT {$start},{$limit}");
		foreach ($query->rows as $result) {
			$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
		}
		
		// $product_data = $this->cache->get ( 'product.onSaleProduct.' . ( int
		// ) $this->config->get ( 'config_language_id' ) . '.' . ( int )
		// $this->config->get ( 'config_store_id' ) . '.' . $customer_group_id .
		// '.' . ( int ) $start . '.' . ( int ) $limit );
		/*
		 * echo
		 * "<br>***********************************************特价商品***<br>";
		 * var_dump($product_data);
		 */
		
		// **********加入后台设置条件**************
		// if (! $product_data) {
		/*
		 * $query=$this->db->query ( "SELECT count(*) as total FROM `" .
		 * DB_PREFIX . "product` WHERE is_sale=1" );
		 * if($query->row['total']>$start){ $query = $this->db->query ( "SELECT
		 * product_id FROM `" . DB_PREFIX . "product` WHERE is_sale=1 ORDER BY
		 * product_id DESC LIMIT {$start},{$limit}" ); foreach ( $query->rows as
		 * $result ) { $product_data [$result ['product_id']] =
		 * $this->getProduct ( $result ['product_id'] ); $exsits_id [] = $result
		 * ['product_id']; } }else{ $start=$start-$query[''] }
		 */
		// WHERE product_id NOT IN (" . implode ( ",", $exsits_id ) . ")
		// if (count ( $product_data ) < $limit) {
		// $num = $limit - count ( $product_data );
		// $query = $this->db->query ( "SELECT product_id FROM `" . DB_PREFIX .
		// "product_special` GROUP BY product_id ORDER BY product_special_id
		// DESC LIMIT {$start},{$limit}" );
		// foreach ( $query->rows as $result ) {
		// $product_data [$result ['product_id']] = $this->getProduct ( $result
		// ['product_id'] );
		// }
		// }
		// $this->cache->set ( 'product.onSaleProduct.' . ( int )
		// $this->config->get ( 'config_language_id' ) . '.' . ( int )
		// $this->config->get ( 'config_store_id' ) . '.' . $customer_group_id .
		// '.' . ( int ) $limit, $product_data );
		// }
		

		return $product_data;
	}
	public function getPopularProducts($limit) {
		$product_data = array();
		
		$query = $this->db->query("SELECT p.product_id FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "' ORDER BY p.viewed, p.date_added DESC LIMIT " . (int) $limit);
		
		foreach ($query->rows as $result) {
			$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
		}
		
		return $product_data;
	}
	
	/**
	 * 获取热销商品
	 */
	public function getBestSellerProducts($limit) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		
		// $product_data = $this->cache->get ( 'product.bestseller.' . ( int )
		// $this->config->get ( 'config_language_id' ) . '.' . ( int )
		// $this->config->get ( 'config_store_id' ) . '.' . $customer_group_id .
		// '.' . ( int ) $limit );
		

		// **********加入后台设置条件**************
		if (empty($product_data)) {
			
			$query = $this->db->query("SELECT product_id FROM `" . DB_PREFIX . "product` WHERE is_hot=1 ORDER BY product_id DESC LIMIT {$limit}");
			foreach ($query->rows as $result) {
				$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
			}
		}
		if (count($product_data) < $limit) {
			$limit = $limit - count($product_data);
			$query = $this->db->query("SELECT op.product_id, COUNT(*) AS total FROM " . DB_PREFIX . "order_product op LEFT JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id) LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE o.order_status_id > '0' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "' GROUP BY op.product_id ORDER BY total DESC LIMIT " . (int) $limit);
			
			foreach ($query->rows as $result) {
				$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
			}
			
			// $this->cache->set ( 'product.bestseller.' . ( int )
			// $this->config->get ( 'config_language_id' ) . '.' . ( int )
			// $this->config->get ( 'config_store_id' ) . '.' .
			// $customer_group_id .
			// '.' . ( int ) $limit, $product_data );
		}
		
		return $product_data;
	}
	public function getProductAttributes($product_id) {
		$product_attribute_group_data = array();
		
		$product_attribute_group_query = $this->db->query("SELECT ag.attribute_group_id, agd.name FROM " . DB_PREFIX . "product_attribute pa LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id) LEFT JOIN " . DB_PREFIX . "attribute_group ag ON (a.attribute_group_id = ag.attribute_group_id) LEFT JOIN " . DB_PREFIX . "attribute_group_description agd ON (ag.attribute_group_id = agd.attribute_group_id) WHERE pa.product_id = '" . (int) $product_id . "' AND agd.language_id = '" . (int) $this->config->get('config_language_id') . "' GROUP BY ag.attribute_group_id ORDER BY ag.sort_order, agd.name");
		
		foreach ($product_attribute_group_query->rows as $product_attribute_group) {
			$product_attribute_data = array();
			
			$product_attribute_query = $this->db->query("SELECT a.attribute_id, ad.name, pa.text FROM " . DB_PREFIX . "product_attribute pa LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id) LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id) WHERE pa.product_id = '" . (int) $product_id . "' AND a.attribute_group_id = '" . (int) $product_attribute_group['attribute_group_id'] . "' AND ad.language_id = '" . (int) $this->config->get('config_language_id') . "' AND pa.language_id = '" . (int) $this->config->get('config_language_id') . "' ORDER BY a.sort_order, ad.name");
			
			foreach ($product_attribute_query->rows as $product_attribute) {
				$product_attribute_data[] = array( 
					'attribute_id' => $product_attribute['attribute_id'], 
					'name' => $product_attribute['name'], 
					'text' => $product_attribute['text'] 
				);
			}
			
			$product_attribute_group_data[] = array( 
				'attribute_group_id' => $product_attribute_group['attribute_group_id'], 
				'name' => $product_attribute_group['name'], 
				'attribute' => $product_attribute_data 
			);
		}
		
		return $product_attribute_group_data;
	}
	public function getProductOptions($product_id) {
		$product_option_data = array();
		
		$product_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option po LEFT JOIN `" . DB_PREFIX . "option` o ON (po.option_id = o.option_id) LEFT JOIN " . DB_PREFIX . "option_description od ON (o.option_id = od.option_id) WHERE po.product_id = '" . (int) $product_id . "' AND od.language_id = '" . (int) $this->config->get('config_language_id') . "' ORDER BY o.sort_order");
		
		foreach ($product_option_query->rows as $product_option) {
			if ($product_option['type'] == 'select' || $product_option['type'] == 'radio' || $product_option['type'] == 'checkbox' || $product_option['type'] == 'image') {
				$product_option_value_data = array();
				
				$product_option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id) LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE pov.product_id = '" . (int) $product_id . "' AND pov.product_option_id = '" . (int) $product_option['product_option_id'] . "' AND ovd.language_id = '" . (int) $this->config->get('config_language_id') . "' ORDER BY ov.sort_order");
				
				foreach ($product_option_value_query->rows as $product_option_value) {
					$product_option_value_data[] = array( 
						'product_option_value_id' => $product_option_value['product_option_value_id'], 
						'option_value_id' => $product_option_value['option_value_id'], 
						'name' => $product_option_value['name'], 
						'image' => $product_option_value['image'], 
						'quantity' => $product_option_value['quantity'], 
						'subtract' => $product_option_value['subtract'], 
						'price' => $product_option_value['price'], 
						'price_prefix' => $product_option_value['price_prefix'], 
						'weight' => $product_option_value['weight'], 
						'weight_prefix' => $product_option_value['weight_prefix'] 
					);
				}
				
				$product_option_data[] = array( 
					'product_option_id' => $product_option['product_option_id'], 
					'option_id' => $product_option['option_id'], 
					'name' => $product_option['name'], 
					'type' => $product_option['type'], 
					'option_value' => $product_option_value_data, 
					'required' => $product_option['required'] 
				);
			}
			else {
				$product_option_data[] = array( 
					'product_option_id' => $product_option['product_option_id'], 
					'option_id' => $product_option['option_id'], 
					'name' => $product_option['name'], 
					'type' => $product_option['type'], 
					'option_value' => $product_option['option_value'], 
					'required' => $product_option['required'] 
				);
			}
		}
		
		return $product_option_data;
	}
	public function getProductDiscounts($product_id) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int) $product_id . "' AND customer_group_id = '" . (int) $customer_group_id . "' AND quantity > 1 AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity ASC, priority ASC, price ASC");
		
		return $query->rows;
	}
	public function getProductImages($product_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_image WHERE product_id = '" . (int) $product_id . "' ORDER BY sort_order ASC");
		
		return $query->rows;
	}
	public function getProductRelated($product_id) {
		$product_data = array();
		
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_related pr LEFT JOIN " . DB_PREFIX . "product p ON (pr.related_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pr.product_id = '" . (int) $product_id . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "'");
		
		foreach ($query->rows as $result) {
			$product_data[$result['related_id']] = $this->getProduct($result['related_id']);
		}
		
		return $product_data;
	}
	public function getProductTags($product_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_tag WHERE product_id = '" . (int) $product_id . "' AND language_id = '" . (int) $this->config->get('config_language_id') . "'");
		
		return $query->rows;
	}
	public function getProductLayoutId($product_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_layout WHERE product_id = '" . (int) $product_id . "' AND store_id = '" . (int) $this->config->get('config_store_id') . "'");
		
		if ($query->num_rows) {
			return $query->row['layout_id'];
		}
		else {
			return $this->config->get('config_layout_product');
		}
	}
	public function getCategories($product_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int) $product_id . "'");
		
		return $query->rows;
	}
	public function getTotalProducts($data = array()) {
		$sql = "SELECT COUNT(DISTINCT p.product_id) AS total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)";
		
		if (!empty($data['filter_category_id'])) {
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id)";
		}
		
		if (!empty($data['filter_tag'])) {
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_tag pt ON (p.product_id = pt.product_id)";
		}
		
		if (isset($data['filter'])) {
			$sql .= " JOIN " . DB_PREFIX . "product_attribute pa ON (p.product_id=pa.product_id) ";
		}
		
		$sql .= " WHERE pd.language_id = '" . (int) $this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "'";
		
		// 是否是推荐商品
		if (!empty($data['is_rec'])) {
			$sql .= " AND p.is_rec=1 ";
		}
		
		// 是否是特价商品
		if (!empty($data['is_sale'])) {
			$sql .= " AND p.is_sale=1";
		}
		
		if (!empty($data['filter'])) {
			$filters = array();
			foreach ($data['filter'] as $fid => $text) {
				$filters[] = " (pa.attribute_id={$fid} AND pa.text='{$text}') ";
			}
			$sql .= " AND (" . implode(" AND ", $filters) . ") AND pa.language_id=" . (int) $this->config->get('config_language_id');
			$con_num = count($filters);
		}
		
		if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {
			$sql .= " AND (";
			
			if (!empty($data['filter_name'])) {
				$implode = array();
				
				$words = explode(' ', trim(preg_replace('/\s\s+/', ' ', $data['filter_name'])));
				
				foreach ($words as $word) {
					if (!empty($data['filter_description'])) {
						$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' AND LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
					}
					else {
						$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
					}
				}
				
				if ($implode) {
					$sql .= " " . implode(" AND ", $implode) . "";
				}
			}
			
			if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {
				$sql .= " OR ";
			}
			
			if (!empty($data['filter_tag'])) {
				$implode = array();
				
				$words = explode(' ', trim(preg_replace('/\s\s+/', ' ', $data['filter_tag'])));
				
				foreach ($words as $word) {
					$implode[] = "LCASE(pt.tag) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
				}
				
				if ($implode) {
					$sql .= " " . implode(" AND ", $implode) . " AND pt.language_id = '" . (int) $this->config->get('config_language_id') . "'";
				}
			}
			
			$sql .= ")";
		}
		
		if (!empty($data['filter_category_id'])) {
			if (!empty($data['filter_sub_category'])) {
				$implode_data = array();
				
				$implode_data[] = "p2c.category_id = '" . (int) $data['filter_category_id'] . "'";
				
				$this->load->model('catalog/category');
				
				$categories = $this->model_catalog_category->getCategoriesByParentId($data['filter_category_id']);
				
				foreach ($categories as $category_id) {
					$implode_data[] = "p2c.category_id = '" . (int) $category_id . "'";
				}
				
				$sql .= " AND (" . implode(' OR ', $implode_data) . ")";
			}
			else {
				$sql .= " AND p2c.category_id = '" . (int) $data['filter_category_id'] . "'";
			}
		}
		
		if (!empty($data['filter_manufacturer_id'])) {
			$sql .= " AND p.manufacturer_id = '" . (int) $data['filter_manufacturer_id'] . "'";
		}
		
		if (isset($con_num)) {
			$sql .= " HAVING (count(pa.attribute_id)={$con_num}) ";
		}
		
		$query = $this->db->query($sql);
		
		return $query->row['total'];
	}
	public function getTotalProductSpecials() {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		
		$query = $this->db->query("SELECT COUNT(DISTINCT ps.product_id) AS total FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int) $customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()))");
		
		if (isset($query->row['total'])) {
			return $query->row['total'];
		}
		else {
			return 0;
		}
	}
	public function getHotProductByCatId($category_id, $limit = 10) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		}
		else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}
		
		$product_data = $this->cache->get('product.bestseller.' . (int) $this->config->get('config_language_id') . '.' . (int) $this->config->get('config_store_id') . '.' . $customer_group_id . '.' . $category_id . '.' . (int) $limit);
		
		// **********加入后台设置条件**************
		/*
		 * if(empty($product_data)){ $query=$this->db->query("SELECT product_id
		 * FROM `" . DB_PREFIX . "product` WHERE is_hot=1 ORDER BY product_id
		 * DESC LIMIT {$limit}"); foreach ($query->rows as $result){
		 * $product_data[$result['product_id']] =
		 * $this->getProduct($result['product_id']); } }
		 */
		if (!$product_data) {
			$query = $this->db->query("SELECT op.product_id, COUNT(*) AS total 
										 FROM " . DB_PREFIX . "order_product op 
										 LEFT JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id) 
										 LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) 
										 LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) 
										 LEFT JOIN `" . DB_PREFIX . "product_to_category` p2c ON p.product_id=p2c.product_id 
										 WHERE p2c.category_id={$category_id} AND o.order_status_id > '0' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "' GROUP BY op.product_id ORDER BY total DESC LIMIT " . (int) $limit);
			
			foreach ($query->rows as $result) {
				$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
			}
			
			$this->cache->set('product.bestseller.' . (int) $this->config->get('config_language_id') . '.' . (int) $this->config->get('config_store_id') . '.' . $customer_group_id . '.' . $category_id . '.' . (int) $limit, $product_data);
		}
		
		return $product_data;
	}
	public function cut_str($str, $num, $auto = '...') {
		if (strlen($str) > $num) {
			$str = substr($str, 0, $num) . $auto;
		}
		return $str;
	}
	public function getBestSellerTotal() {
		$query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "order_product op LEFT JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id) LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE o.order_status_id > '0' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "' GROUP BY op.product_id");
		return $query->row['total'];
	}
}
?>